package com.mallcai.bigdata.ladon.service.common;

import com.alicp.jetcache.anno.CacheInvalidate;
import com.alicp.jetcache.anno.Cached;
import com.mallcai.bigdata.ladon.dpl.entity.common.Datasource;
import com.mallcai.bigdata.ladon.service.report.impl.ReportQueryConstants;
import com.mallcai.bigdata.ladon.vo.*;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Created by oneape<oneape15@163.com>
 * Created 2019-05-27 17:11.
 * Modify:
 */
public interface IDatasourceService {

    public static final String CACHE_GET_BY_ID = "IDatasourceService.getById";

    /**
     * 添加数据源
     *
     * @param datasource Datasource
     * @return int 1 - 成功; 0 - 失败;
     */
    @CacheInvalidate(name = CACHE_GET_BY_ID, key = "args[0].id")
    int addDatasource(Datasource datasource);

    /**
     * 修改数据源
     *
     * @param datasource Datasource
     * @return int 1 - 成功; 0 - 失败;
     */
    @CacheInvalidate(name = CACHE_GET_BY_ID, key = "args[0].id")
    int editDatasource(Datasource datasource);

    /**
     * 判断数据源是否正在使用中
     *
     * @param dsId Long
     * @return boolean
     */
    boolean isUsing(Long dsId);

    /**
     * 删除数据源
     *
     * @param datasource Datasource
     * @return int 1 - 成功; 0 - 失败;
     */
    @CacheInvalidate(name = CACHE_GET_BY_ID, key = "args[0].id")
    int deleteDatasource(Datasource datasource);

    /**
     * 根据条件查询数据源
     *
     * @param params Map
     * @return List
     */
    List<Datasource> getByParams(Map<String, Object> params);

    /**
     * 根据Id查询数据源
     *
     * @param id Long 数据id
     * @return Datasource
     */
    @Cached(name = CACHE_GET_BY_ID, key = "args[0]",
            expire = 10, timeUnit = TimeUnit.MINUTES)
    Datasource getById(Long id);

    /**
     * 获取指定数据源的所有表结构
     *
     * @param dsId Long   数据源Id
     * @return List
     */
    List<TableVo> getAllTables(Long dsId);

    /**
     * 获取指定数据源下面的表的字段列表
     *
     * @param dsId      Long   数据源Id
     * @param tableName String 表名称
     * @return List
     */
    List<ColumnVo> getTableColumns(Long dsId, String tableName);

    /**
     * 执行Sql获取结果
     *
     * @param dsId  Long 数据源Id
     * @param param QueryParam 查询条件
     * @return DataVo
     */
    DataVo execSql(Long dsId, QueryParam param);

    /**
     * 执行Sql获取结果
     *
     * @param ds    Datasource
     * @param param QueryParam 查询条件
     * @return DataVo
     */
    DataVo execSql(Datasource ds, QueryParam param);

    /**
     * 异步导出数据到邮箱中
     *
     * @param ds    Datasource 数据源信息
     * @param param ExportParam 导出参数
     * @return int
     */
    int asynSendData2Email(Datasource ds, ExportParam param);

    /**
     * 执行sql
     * @param dsId
     * @param param
     */
    void execute(Long dsId, QueryParam param);

    /**
     * 批量更新
     * @param dsId
     * @param batchUpdateParam
     */
    <T> int[][] batchUpdate(Long dsId, BatchUpdateParam<T> batchUpdateParam);

    /**
     * 测试数据源
     * @param datasource Datasource
     * @return int 1 - 成功; 0 - 失败;
     */
    boolean test(Datasource datasource);
}
